﻿using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using PM.Entities;

namespace PM.BusinessLayer
{
    public class DataController
    {
        #region CRUD operation with project data
        public List<Speciality> SelectSpecialities()
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                return dc.GetTable<Speciality>().ToList();
            }
        }

        public void InsertSpeciality(Speciality speciality)
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                dc.GetTable<Speciality>().InsertOnSubmit(speciality);
                dc.SubmitChanges();
            }
        }

        public void DeleteSpeciality(Speciality value)
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                value = dc.GetTable<Speciality>().SingleOrDefault(s => s.SpecialityID == value.SpecialityID);
                //Перед видаленням спеціальності видаляємо всі записи по всіх таблицях
                //де є зовнішні залежності з на спеціальність
                DeleteDependensFromShedule(value.SpecialityID, value.GetType().ToString());

                dc.GetTable<Speciality>().DeleteOnSubmit(
                    dc.GetTable<Speciality>().SingleOrDefault(s => s.SpecialityID == value.SpecialityID));
                dc.SubmitChanges();
            }
        }
      

        public List<Group> SelectGroups()
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                return dc.GetTable<Group>().ToList();
            }
        }
        public void InsertGroup(Group group)
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                dc.GetTable<Group>().InsertOnSubmit(group);
                dc.SubmitChanges();
            }
        }

        public void DeleteGroup(Group value)
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                DeleteDependensFromShedule(value.GroupID, value.GetType().ToString());

                dc.GetTable<Group>().DeleteOnSubmit(dc.GetTable<Group>().SingleOrDefault(s => s.GroupID == value.GroupID));
                dc.SubmitChanges();
            }
        }

        public List<Subject> SelectSubjects()
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                return dc.GetTable<Subject>().ToList();
            }
        }
        public void InsertSubject(Subject subject)
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                dc.GetTable<Subject>().InsertOnSubmit(subject);
                dc.SubmitChanges();
            }
        }

        public void DeleteSubject(Subject value)
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                DeleteDependensFromShedule(value.SubjectID, value.GetType().ToString());

                dc.GetTable<Subject>().DeleteOnSubmit(dc.GetTable<Subject>().SingleOrDefault(s => s.SubjectID == value.SubjectID));
                dc.SubmitChanges();
            }
        }
        /**
        * видаляє з розкладу Shedule усі посилання на сутності 
        * тобто забираємо залежності таблиць
        **/
        private void DeleteDependensFromShedule(int ID, string entityType)
        {
            using (DataContext dc = Infrastructure.DataContext)
            {
                /**
                 * отримуєм список сутностей Shedule в яких
                 * є посилання на таблицю з якої потрібно видалити дані
                 **/
                List<Shedule> _shedules = null;
                switch (entityType.ToLower())
                {
                    case "pm.entities.speciality":
                        _shedules = dc.GetTable<Shedule>().Where(s => s.SpecialityID == ID).ToList();
                        break;
                    case "pm.entities.subject":
                        dc.GetTable<Shedule>().Where(s => s.SubjectID == ID).ToList();
                        break;
                    case "pm.entities.group":
                        dc.GetTable<Shedule>().Where(s => s.GroupID == ID).ToList();
                        break;
                }

                /**
                 * проходимо циклом по отриманих сутностях і видаляємо
                 * по черзі кожну з них
                 **/
                if (_shedules != null)
                {
                    if (_shedules.Count != 0)
                    {
                        foreach(Shedule shedule in _shedules)
                        {
                            if (shedule != null)
                            {
                                dc.GetTable<Shedule>().DeleteOnSubmit(
                                    dc.GetTable<Shedule>().SingleOrDefault(s => s.SheduleID == shedule.SheduleID));
                            }
                        }
                        dc.SubmitChanges();
                    }
                }
            }
        }

        #endregion
    }
}
